<?php

/**
 * Clase para gestionar la librería de mysqli para PHP de forma fácil y rápida.
 * @autor José Cabo Carsí - folcwine@gmail.com - http://bloodblog.net/
 * */
class sbl2{
	
	/**
	 * Host del servidor.
	 * @var string
	 * */
	private $host;
	
	/**
	 * Usuario de conexión al servidor.
	 * @var string
	 * */
	private $user;
	
	/**
	 * Contraseña del $user para conectarse al servidor.
	 * @var string
	 * */
	private $pass;
	
	/**
	 * Base de datos a seleccionar.
	 * @var string
	 * */
	private $db;
	
	/**
	 * Objeto de conexión de mysql-php
	 * */
	private $connection;
	
	/**
	 * Listado de query.
	 * @var array<string>
	 * */
	private $queryList;
	
	/**
	 * Texto de inicio de una transacción
	 * @var string
	 * */
	const startTransaccion = 'START TRANSACTION;';
	
	/**
	 * Texto de confirmar cambios de una transacción.
	 * @var string
	 * */
	const commit = 'COMMIT;';
	
	/**
	 * Texto de deshacer cambios de una transacción.
	 * @var string
	 * */
	const rollback = 'ROLLBACK;';
	
	/**
	 * Mensaje de error a la hora de intentar conectarse al servidor donde está alojada la base de datos.
	 * @var string
	 * */
	const MSG_ERROR_CANTCOONNECTSERVER = 'Imposible conectarse al servidor de la base de datos.';
	
	/**
	 * Mensaje de error a la hora de intentar seleccionar la base de datos con la que se va a trabajar.
	 * */
	const MSG_ERROR_CANTSELECTDB = 'Imposible seleccionar la base de datos.';
	
	/**
	 * Mensaje de error a la hora de realizar la consulta.
	 * */
	const MSG_ERROR_WRONGQUERY = 'Error al realizar la consulta.';
	
	/**
	 * Mensaje de error cuando se intenta ejecuta una lista de querys vacía.
	 * */
	const MSG_ERROR_NOQUERY = 'No hay ninguna query.';
	
	/**
	 * @param string $host Host de conexión.
	 * @param string $user Usuario de la conexión.
	 * @param string $pass Contraseña del usuario de la conexión.
	 * @param string $db Base de datos a seleccionar una vez realizada la conexión.
	 * */
	public function __construct($host, $user, $pass, $db){
		if(isset($host) && isset($user) && isset($pass) && isset($db)){
			$this->host = $host;
			$this->user = $user;
			$this->pass = $pass;
			$this->db = $db;
						
			$this->connection = mysqli_connect($this->host, $this->user, $this->pass, $this->db);			
			if (mysqli_connect_errno()) {
				die("Connect failed: '.mysqli_connect_error().'\n" .  self::MSG_ERROR_CANTCOONNECTSERVER);
			}
			
			/*
			$connection = mysql_connect(self::$host, self::$user, self::$pass)
				or die(self::MSG_WARNING_CANTCOONNECTSERVER. mysql_error());
				
			mysql_select_db($this->db , $this->connection)
				or die(self::MSG_ERROR_CANTSELECTDB. mysql_error());*/
		}
		
		$this->queryList = array();
	}
	
	/**
	 * Traducción string de formulario
	 * @return Texto formateado.
	 * */
	public function formsql($consulta){
		return mysqli_real_escape_string($this->connection, $consulta);		
	}
	
	/**
	 * Convierte un objeto resultado de mysql a un Array de PHP y libera la memoria del resultado mysql.
	 * @param mysqli_result $resul Resultado de mysql.
	 * */
	private function arrayzar($resul) {
		if(is_bool($resul)) return NULL;
		
		$reg = array();
		
		while ($registro=mysqli_fetch_assoc($resul)) array_push($reg, $registro);
		
		mysqli_free_result($resul);
		return $reg;
	}
	
	/**
	 * Obtiene el objeto de conexión mysql-php
	 * @return mysql-php
	 * */
	public function getConnection(){
		return $this->connection;
	}
	
	/**
	 * Envía una consulta dada inmediatamente.
	 * @param string $query La query que se desea enviar inmeditamente.
	 * 
	 * @return $arrayName array|array('id', int)
	 * */
	public function queryThis($query, $insert = false){
		if($insert) {			
			$stmt = mysqli_prepare($this->connection, $query);
			mysqli_stmt_execute($stmt);
			
			//Devuelve el último id insertado.
			$reg = array('id' => mysqli_stmt_insert_id($stmt));
		} else {
			$res = mysqli_query($this->connection, $query) or
			die (self::MSG_ERROR_WRONGQUERY. mysqli_error($this->connection) .' <br />Query: <b>'.$query.'</b><br />');
			$reg = $this->arrayzar($res);
		}			
		
		return $reg;
	}
	
	/**
	 * Añade una query a la lista de ejeción. Puede ser ejecutada inmediatamente.
	 * @param string $consulta La nueva consulta a añadir a la pila de ejecución.
	 * @param bool $send=false Fuerza el envío de la lista de consultas.
	 * 
	 * @return array|null
	 * */
	public function add($consulta, $send = false){
		array_push($this->queryList, $consulta);
		if($send) return $this->send();
		return null;
	}
	
	/**
	 * Ejecuta toda la lista de querys Almacenada.
	 * @param bool $lastQueryIsInsert Si la última query es un Insert y se requiere el último ID añadido se marca como true.
	 * 
	 * @return arrray|array('id' => VALUE)
	 * */
	public function send($lastQueryIsInsert = false){
		$cant = count($this->queryList);
		
		if($cant == 1){
			$result = $this->queryThis($this->queryList[0]);
		} elseif($cant > 1){
			$this->queryThis(self::startTransaccion);
			foreach($this->queryList as $query){
				$result = $this->queryThis($query);
			}
			if($lastQueryIsInsert) $result = array('id' => mysqli_stmt_insert_id($this->connection));
			$this->queryThis(self::commit);
		} else {
			die(self::MSG_ERROR_NOQUERY);
		}
		
		$this->cleanQueryList();
		return $result;
	}
	
	/**
	 * Limpia la lista de querys.
	 * */
	public function cleanQueryList(){
		$this->queryList = array();
	}
}

?>